﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using AccesoADatos;

namespace LogicaDeNegocios
{
    public class ExamenesCodigos
    {
        #region Campos

        AuxiliarExamenCodigo Auxiliar;

        #endregion

        #region Constructor

        public ExamenesCodigos()
        {
            Auxiliar = new AuxiliarExamenCodigo();
        }

        #endregion

        #region Métodos

        #region Agregar Código de Examen

        public bool Agregar(ExamenCodigo nuevoExamenCodigo)
        {
            bool resultado = false;

            try
            {
                var examenCodigoAgregado = Auxiliar.Agregar(nuevoExamenCodigo);

                if (examenCodigoAgregado != null)
                {
                    resultado = true;
                }

            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return resultado;
        }

        #endregion

        #region Modificar Código de Examen

        public bool Modificar(ExamenCodigo examenCodigoAModificar)
        {
            bool resultado = false;

            try
            {
                Auxiliar.Modificar(examenCodigoAModificar);
                resultado = true;
            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return resultado;
        }
        #endregion

        #region Eliminar Código de Examen

        public bool Eliminar(ExamenCodigo examenCodigoAEliminar)
        {
            bool resultado = false;

            try
            {
                Auxiliar.Eliminar(examenCodigoAEliminar);
                resultado = true;
            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return resultado;
        }

        #endregion

        #region Obtener Códigos de Examenes

        public List<ExamenCodigo> ObtenerCodigosExamenes(string codigo = "", string examenClave = "", byte tipoEstado = 0)
        {
            List<ExamenCodigo> resultado = null;

            try
            {
                resultado = Auxiliar.Listar(codigo, examenClave, tipoEstado);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            return resultado;
        }

        #endregion

        #region Obtener Código Examen
        public ExamenCodigo ObtenerCodigoExamen(string codigo)
        {
            return ObtenerCodigosExamenes(codigo).FirstOrDefault();
        }
        #endregion

        #region Obtener Informacion Examen Codigo

        public ExamenCodigoMostrar ObtenerInformacionExamenCodigo(string codigo)
        {
            ExamenCodigoMostrar resultado = null;

            try
            {
                resultado = Auxiliar.Obtener(codigo);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

            return resultado;
        }

        #endregion

        #region Calificar Examen
        public Resultado CalificarExamen(string claveExamen, string examenCodigo)
        {
            const byte aprobado = 2;
            const byte reprobado = 3;

            Resultado resultado = new Resultado();

            LogicaDeNegocios.Examenes e = new LogicaDeNegocios.Examenes();
            Examen examen = e.ObtenerExamen(claveExamen);
            resultado.PreguntasTotales = examen.NumeroPreguntas;
            double porcentajeAprobacion = examen.PorcentajeAprobacion;

            short noPreguntasSinContestar = 0;
            short noPreguntasCorrectas = 0;
            short noPreguntasInCorrectas = 0;

            var ec = this.ObtenerCodigoExamen(examenCodigo);

            LogicaDeNegocios.ExamenesPreguntas ep = new LogicaDeNegocios.ExamenesPreguntas();
            var preguntasExamen = ep.Listar(examenCodigo).Where(pe => pe.FechaHoraInicio > ec.FechaHoraInicioUltimoIntento);

            foreach (var preguntaExamen in preguntasExamen)
            {
                if (preguntaExamen.ConsecutivosRespuestasUsuario == "")
                {
                    noPreguntasSinContestar++;
                }
                if (preguntaExamen.RespuestaAprobada)
                {
                    noPreguntasCorrectas++;
                }
                else
                {
                    noPreguntasInCorrectas++;
                }

            }

            resultado.PreguntasCorrectas = noPreguntasCorrectas;
            resultado.PreguntasIncorrectas = noPreguntasInCorrectas;
            resultado.PreguntasSinContestar = noPreguntasSinContestar;

            var relacion = Convert.ToDouble(noPreguntasCorrectas) / Convert.ToDouble(examen.NumeroPreguntas);
            resultado.Porcentaje = Convert.ToInt32(relacion * 100);
            resultado.Aprobado = relacion >= examen.PorcentajeAprobacion ? true : false;

            if (resultado.Aprobado)
            {
                ec.TipoEstadosExamenCodigo = aprobado;
            }
            else
            {
                ec.TipoEstadosExamenCodigo = reprobado;
            }

            ec.FechaHoraFinalUltimoIntento = DateTime.Now;
            this.Modificar(ec);


            return resultado;
        }

        #endregion        

        #region Reiniciar informacion del Examen Codigo

        public bool Reiniciar(string codigoExamen)
        {
            var historiales = new LogicaDeNegocios.Historiales();
            
            var ultimoHistorial = historiales.ObtenerHistoriales(codigoExamen).OrderBy(h => h.FechaHoraInicio).LastOrDefault();
            
            var examenCodigo = this.ObtenerCodigoExamen(codigoExamen);

            Examenes examenes = new Examenes();

            var examen = examenes.ObtenerExamen(examenCodigo.ExamenesClave);

            examenCodigo.CantidadPreguntasPorResponder = examen.NumeroPreguntas;
            examenCodigo.CantidadPreguntasNoRespondidas = 0;
            examenCodigo.CantidadPreguntasRespondidas = 0;
            examenCodigo.TipoEstadosExamenCodigo = (byte)TipoEstadoExamen.SinConcluir;
            examenCodigo.IntentosRealizado = Convert.ToByte(examenCodigo.IntentosRealizado + 1);
            examenCodigo.FechaHoraInicioUltimoIntento = ultimoHistorial.FechaHoraInicio;

            
            return this.Modificar(examenCodigo);
        }



        #endregion      
     
        #endregion



    }
}
